package main

import "fmt"

type integer int

type Student struct {
	name string
	age  int
}

// 定义函数类型（适合回调）
type HandlerFunc func(string) string

func helloHandler(name string) string {
	return "hello, " + name
}

func call(h HandlerFunc) {
	fmt.Println(h("GO"))
}

type Animal interface {
	// Go 的接口是行为的抽象，定义好后任何结构体实现它的方法即可自动实现接口（没有关键字 implements）
	Speak() string
}

type Gender int

const (
	Male Gender = iota
	Female
	Unknown
)

// 定义接口
type Speaker interface {
	Speak() string
}

// 定义结构体 Person , 并实现接口
type Person struct {
	Name string
}

func (p Person) Speak() string {
	return "你好，我是" + p.Name
}

// 定义接口Robot 结构体，并实现接口
type Robot struct {
	ID int
}

func (r Robot) Speak() string {
	return fmt.Sprintf("Hello , I'am robot #%d\n", r.ID)
}

// 定义一个函数，接收接口类型参数
func SaySomething(s Speaker) {
	fmt.Println(s.Speak())
}

func main() {
	var a integer = 1
	fmt.Printf("the nums is: %d, the type is: %T\n", a, a)

	s1 := Student{
		name: "alen",
		age:  10,
	}
	fmt.Println("the student is: ", s1)

	callHandler("golang", HelloHandler)
	callHandler("golang", goodbyeHandler)

	// 创建实例
	p := Person{Name: "Jack"}
	r := Robot{ID: 1001}

	// 多肽: 传入接口参数，自动调用对应实现
	SaySomething(p)
	SaySomething(r)

}

// 步骤 12.9：定义一个函数类型
type HandlerFunction func(string) string

// 步骤 2：定义符合这个函数类型的两个函数
func HelloHandler(name string) string {
	return "Hello, " + name
}

func goodbyeHandler(name string) string {
	return "Goodbye, " + name
}

// 步骤 3：定义一个接受 HandlerFunc 的函数
func callHandler(name string, handler HandlerFunction) {
	result := handler(name)
	fmt.Println(result)
}
